package com.ktjiaoyu.controller;

import com.alibaba.fastjson2.JSON;
import com.ktjiaoyu.entity.SysUser;
import com.ktjiaoyu.ex.LoginException;
import com.ktjiaoyu.service.SysUserService;
import com.ktjiaoyu.utils.Constants;
import io.micrometer.common.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;

/**
 * @return 13141
 * 2025/7/1
 * 16:06
 */
@Controller
public class LoginController extends BaseController {
    @Autowired
    private SysUserService sysUserService;

    @GetMapping("/login")
    public String toLogin() {
        // 由于 login.jsp页面不在 WEB-INF 下，所以不能返回逻辑视图名称
        // 需要使用 forward:前缀告知 SpringMVC 转发到根路径下的 login.jsp
        return forward("/login.jsp");
    }

    @PostMapping("/login")
    public String login(@RequestParam("account") String account,
                        @RequestParam("password") String password) {
//        String url = "jdbc:mysql://localhost:3306/ktsms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
//        String user = "root";
//        String password2 = "123456";
//        try (Connection conn = DriverManager.getConnection(url, user, password2)) {
//            System.out.println("连接成功！");
//        } catch (SQLException e) {
//            throw new CannotCreateTransactionException("JDBC连接数据库失败");
//        }
        SysUser loginUser = sysUserService.login(account, password);
        if (loginUser != null) {
            // 登录成功，用户信息存入 session
            session(Constants.SESSION_USER, loginUser);
            // 重定向到后台首页
            return redirect("/main/index");
        } else {
//            // 设置错误信息到 request 作用域
//            request(Constants.REQUEST_ERROR, loginUser);
//            // 转发到登录页面
//            return forward("login.jsp");
//            登录失败抛出异常
//            throw new RuntimeException("登录失败，用户名或密码错误！");
            throw new LoginException("登录失败，用户名或者密码错误！");
        }
    }

    // 跳转到后台首页
    @GetMapping("/main/index")
    public String index() {
        return "index";
    }

    // 增加一个抛出 RuntimeException 异常的接口
    @GetMapping("/ex")
    public void throwException() {
        throw new RuntimeException("测试不同异常映射到不同页面");
    }

    //    注销方法
    @GetMapping("/logout")
    public String logOut() {
        session().removeAttribute(Constants.SESSION_USER);
        return redirect("/login");
    }

    // 局部异常处理
//    @ExceptionHandler(value = RuntimeException.class)
//    public String handlerException(RuntimeException e, HttpServletRequest request) {
////        设置捕获的错误对象到 request 作用域
//        request.setAttribute(Constants.REQUEST_ERROR, e);
    /// /        跳转异常页面：/WEB-INF/jsp/500.jsp
//        return "500";
//    }

    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

    @ResponseBody
    @GetMapping("/main/oldPasswordCheck")
    public String accountExist(@RequestParam("oldPassword") String oldPassword) {
        LOGGER.debug("检查旧密码 oldPassword={}旧密码是否正确是否存在", oldPassword);
        HashMap<String, Object> resultMap = new HashMap<String, Object>();
        if (StringUtils.isEmpty(oldPassword)) {
            resultMap.put("pass", 0);
        } else {
            try {
                // 获取登录用户
                SysUser loginUser = session(Constants.SESSION_USER);
                boolean ok = sysUserService.checkOldPassword(loginUser.getId(), oldPassword);
                if (ok) {
//                    已经存在，设置为1
                    resultMap.put("pass", 1);
                } else {
                    resultMap.put("pass", 0);
                }
            } catch (Exception e) {
                LOGGER.error("ChangePwdController 中的" + "oldPassword方法执行出现错误。", e);
                resultMap.put("error", "出现异常，请联系管理员处理！");
            }
        }
        return JSON.toJSONString(resultMap);
    }
    // 跳转 changePwd.jsp页面
    @GetMapping("/main/changePwd")
    public String toChangePwd() {
        return "sys/changePwd";
    }
    // 点击提交更改密码
    @PostMapping("/main/changePwd")
    public String doChangePwd(@RequestParam("password") String password, Model model) {
        try {
            SysUser loginUser = session(Constants.SESSION_USER);
            boolean ok = sysUserService.updatePwd(loginUser.getId(), password);
            model.addAttribute("password", password);
            if (ok) {
                return redirect("/login");
            }
        } catch (Exception error) {
            LOGGER.error("ChangePwdController 中的 doChangePwd()方法出现错误", error);
            throw new RuntimeException(error);
        }
        return "sys/changePwd";
    }
}
